package com.naiterui.ehp.bs.patient.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.data.domain.Pageable;

import com.naiterui.common.repository.page.Page;
import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.domain.Doctor;
import com.naiterui.ehp.bp.domain.DrBayConsult;
import com.naiterui.ehp.bp.domain.DrConsult;
import com.naiterui.ehp.bp.domain.Hospital;
import com.naiterui.ehp.bs.patient.vo.doctor.DoctorVO;

/**
 * 医生持久化处理
 *
 * @author Amber E-mail:E-mail地址
 * @version 2015年6月21日 上午11:29:47 by Amber
 * @Description 提供医生相关数据的持久化处理
 * @see <接口/父类>
 */
public interface IDoctorDao {

    /**
     * 根据患者id查询患者的所有私人医生列表ids
     *
     * @param patientId
     *
     * @return
     *
     * @Description IDoctorDao.getMyPrivateDoctor()
     * @Author linhf
     * @Date 2016年4月14日
     * @since 1.0.0
     */
    Map<String, Object> getMyPrivateDoctor(Long patientId, int page, int num, Integer accountStatus);

    /**
     * 获取医生列表
     *
     * @param patientId 患者id
     * @param page      页码
     * @param num       每页数量
     *
     * @return Page<Doctor> 医生分页结果集
     *
     * @History 2015年6月22日 下午12:26:58 by Amber
     */
    PageVO<DoctorVO> getMyDoctors(Long patientId, Pageable pageable);

    PageVO<DoctorVO> getAllDoctors(Pageable pageable);

    /**
     * @param patientId     患者id
     * @param accountStatus 账户状态0:正常，1:禁用
     *
     * @return
     *
     * @Title: getMyDoctorList
     * @author: chengqiang
     * @Description: 获取患者所有医生-不分页
     * @date: 2018年8月8日 下午4:46:02
     * @return: List<DoctorVO>
     */
    List<DoctorVO> getMyDoctorList(Long patientId, Integer accountStatus);

    /**
     * 获取医生粉丝数（关注人数+绑定人数）
     *
     * @param doctorId 医生id
     *
     * @return int <粉丝数>
     *
     * @History 2015年6月22日 下午6:26:58 by Amber
     */
    int getFansNum(Long doctorId);

    /**
     * 查找医生
     *
     * @param keyword      关键字
     * @param departmentId 部门id
     * @param cityId       城市id
     * @param page         页码
     * @param num          每页数量
     *
     * @return Page<Doctor> <医生列表页>
     *
     * @History 2015年6月25日 上午9:40:38 by Amber
     */
    Page<Object[]> findDoctors(String keyword, Integer departmentId, Integer cityId, int page, int num);

    /**
     * 查询医院name
     *
     * @param hospitalId
     *
     * @return String <医院名>
     *
     * @History 2015年6月27日 上午12:02:53 by Amber
     */
    String getHospitalName(Integer hospitalId);

    /**
     * 获取医生门诊时间
     *
     * @param doctorId 医生id
     *
     * @return List<DrConsult> <一周出诊时间列表>
     *
     * @History 2015年6月28日 下午8:12:05 by Amber
     */
    List<DrConsult> getDoctorConsults(Long doctorId);

    /**
     * 获取医生互联网医院出诊时间
     *
     * @param doctorId 医生id
     *
     * @return List<DrBayConsult> <一周线上时间>
     *
     * @History 2015年6月28日 下午8:12:40 by Amber
     */
    List<DrBayConsult> getDoctorBayConsults(Long doctorId);

    /**
     * 获取患者私人医生
     * IDoctorDao.getPersonalDoctors()
     *
     * @param patientId
     * @param accountStatus 医生账户状态，-1：全部；0：未禁用；1：已禁用；
     *
     * @return
     *
     * @Author Amber
     * @Date 2016年6月28日
     * @since 1.0.0
     */
    List<Doctor> getPersonalDoctors(Long patientId, int accountStatus);

    /**
     * 获取最新私人医生(非禁用状态)
     * IDoctorDao.getNewPersonalDoctor()<BR>
     * <P>Author : Amber </P>
     * <P>Date : 2015年9月10日 </P>
     *
     * @param patientId
     *
     * @return
     */
    Doctor getNewPersonalDoctor(Long patientId);

    /**
     * 获取医院
     *
     * @param hospitalId
     *
     * @return Hospital <返回值描述>
     *
     * @History 2015年7月2日 下午6:05:16 by Amber
     */
    Hospital getDoctorHospital(Integer hospitalId);

    /**
     * 根据医生id列表，查询医生信息
     * IDoctorDao.getDoctorInfoByDrIds()
     *
     * @param doctorIds
     *
     * @return
     *
     * @Author chenlin
     * @Date 2016年6月29日
     * @since 1.0.0
     */
    Map<Long, Doctor> getDoctorInfoByDrIds(Set<Long> doctorIds);

    /**
     * 获取医生拥有患者数
     * IDoctorDao.getPatientNum()
     *
     * @param doctorId
     *
     * @return
     *
     * @Author xuchong
     * @Date 2016年6月16日
     * @since 1.0.0
     */
    Integer getPatientNum(Long doctorId);

    /**
     * 获取医生的总评价数和好评数
     * IDoctorDao.getDoctorPraiseRate()
     *
     * @param doctorId
     *
     * @return
     *
     * @Author xuchong
     * @Date 2016年6月16日
     * @since 1.0.0
     */
    Map<String, Integer> getDoctorCommentNum(Long doctorId);

    /**
     * 批量获取医map
     * IDoctorDao.getDoctorMap()
     *
     * @param ids
     *
     * @return
     *
     * @Author Gaoll
     * @Date 2016年8月12日
     * @since HZD-1.0.0
     */
    Map<Long, Doctor> getDoctorMap(Collection<Long> ids);

    /**
     * 根据医生id获取医生列表(只查询未禁用的医生)
     * IDoctorDao.getDoctorByIds()
     *
     * @param doctorIds
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年3月16日
     * @since 1.0.0
     */
    List<Doctor> getDoctorByIds(List<Long> doctorIds);

    /**
     * 批量获取医生的患者数
     * IDoctorDao.getDoctorPatientNumByIds()
     *
     * @param ids
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年3月16日
     * @since 1.0.0
     */
    Map<Long, Integer> getDoctorPatientNumByIds(List<Long> ids);

    /**
     * 指获取医生的总评价和好评（批量获取医生好评率）
     * IDoctorDao.getDoctorCommentNumByIds()
     *
     * @param ids
     *
     * @return
     *
     * @Author lichaopi
     * @Date 2018年3月16日
     * @since 1.0.0
     */
    Map<Long, Map<String, Integer>> getDoctorCommentNumByIds(List<Long> ids);

    /**
     * 根据ID获取医生信息
     * @param id
     * @return
     */
    Doctor get(Long id);
}
